package com.langchain4j.core.llm.model;

import lombok.Data;
import lombok.Builder;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;

import java.time.LocalDateTime;
import java.util.Map;

/**
 * 生成结果
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class GenerationResult {
    
    /**
     * 生成的文本内容
     */
    private String content;
    
    /**
     * 使用的模型名称
     */
    private String modelName;
    
    /**
     * 使用的token数量
     */
    private TokenUsage tokenUsage;
    
    /**
     * 生成时间
     */
    private LocalDateTime generatedAt;
    
    /**
     * 是否成功
     */
    private Boolean success;
    
    /**
     * 错误信息
     */
    private String errorMessage;
    
    /**
     * 元数据
     */
    private Map<String, Object> metadata;
    
    /**
     * Token使用情况
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class TokenUsage {
        /**
         * 输入token数
         */
        private Integer promptTokens;
        
        /**
         * 输出token数
         */
        private Integer completionTokens;
        
        /**
         * 总token数
         */
        private Integer totalTokens;
        
        /**
         * 计算总token数
         */
        public Integer getTotalTokens() {
            if (totalTokens != null) {
                return totalTokens;
            }
            return (promptTokens != null ? promptTokens : 0) + 
                   (completionTokens != null ? completionTokens : 0);
        }
    }
    
    /**
     * 创建成功结果
     */
    public static GenerationResult success(String content, String modelName, TokenUsage tokenUsage) {
        return GenerationResult.builder()
                .content(content)
                .modelName(modelName)
                .tokenUsage(tokenUsage)
                .generatedAt(LocalDateTime.now())
                .success(true)
                .build();
    }
    
    /**
     * 创建失败结果
     */
    public static GenerationResult failure(String errorMessage, String modelName) {
        return GenerationResult.builder()
                .modelName(modelName)
                .generatedAt(LocalDateTime.now())
                .success(false)
                .errorMessage(errorMessage)
                .build();
    }
} 